package view;

import domain.dto.*;
import domain.vo.*;
import service.*;

public class UserView{
    public static void printError(String message) {
        /* ANSI 转义码，\033[31m表示红⾊，\033[0m表示重置为默认颜⾊ */
        System.out.println("\033[31m" + message + "\033[0m");
    }
    public static UserVo[] cache;
    public static void printMenu() {
        String menu = """
                    ---------------------
                           ⽤户管理
                    ---------------------
                    |     0...返回上级    |
                    |     1...⽤户列表    |
                    |     2...创建⽤户    |
                    |     3...更新⽤户    |
                    |     4...切换状态    |
                    ---------------------
                    请输⼊选项：""";
        System.out.print(menu);
    }
    public static void show(){
        String menuChoice;
        do {
            printMenu();
            menuChoice = MainView.input.nextLine();
            switch (menuChoice) {
                case "0":
                    System.out.println("已返回上⼀级菜单");
                    break;
                case "1":
                    list();
                    break;
                case "2":
                    create();
                    break;
                case "3":
                    update();
                    break;
                case "4":
                    toggle();
                    break;
                default:
                    System.out.println("输⼊⾮法，请输⼊正确的菜单编号！");
            }
        } while (!"0".equals(menuChoice));
    }


    public static void list() {
        // 调⽤服务层获取所有⽤户数据
        Result result = UserService.list();
        // 将获取到的⽤户数据存⼊缓存
        cache = (UserVo[]) result.data;
        // 输出表头
        System.out.println("ID\t⽤户名\t姓名\t⼿机号\t邮箱\t部⻔名称\t⻆⾊名称\t状态");
                // 遍历缓存中的每个⽤户对象，输出⽤户信息
        for (UserVo user : cache) {
            // 格式化输出每个⽤户的详细信息
            System.out.printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
                    user.id, user.username, user.name, user.mobile,
                    user.email, user.deptName, user.roleName,
                    user.enabled ? "启⽤" : "禁⽤");
        }
    }

    public static void create() {
        // 提示⽤户输⼊基本信息
        System.out.print("请输⼊⽤户名：");
        // 从控制台读取⽤户输⼊的⽤户名
        String username = MainView.input.nextLine();
        System.out.print("请输⼊姓名：");
        // 从控制台读取⽤户输⼊的姓名
        String name = MainView.input.nextLine();
        System.out.print("请输⼊⼿机号：");
        // 从控制台读取⽤户输⼊的⼿机号
        String mobile = MainView.input.nextLine();
        System.out.print("请输⼊邮箱：");
        // 从控制台读取⽤户输⼊的邮箱
        String email = MainView.input.nextLine();
        // 选择部⻔
        System.out.println("请选择部⻔ ID：");
        int deptId = 0;
        do {
            // 显示所有可选的部⻔
            MainView.DeptView.list();
            if (MainView.DeptView.cache == null || MainView.DeptView.cache.length == 0) {
                // 如果没有部⻔数据，提示错误并返回
                printError("系统还没有任何部⻔信息，请先创建部⻔信息。");
                return;
            }
            // 通过⽤户输⼊获取选中的部⻔
            DeptVo dept = MainView.DeptView.getCacheById();
            if (dept != null) {
                deptId = dept.id;
            }
        } while (deptId == 0); // 确保⽤户必须选择有效的部⻔ ID
        // 选择⻆⾊
        System.out.println("请选择⻆⾊ ID：");
        int roleId = 0;
        do {
            // 显示所有可选的⻆⾊
            MainView.RoleView.list();
            if (MainView.RoleView.cache == null || MainView.RoleView.cache.length == 0) {
                // 如果没有⻆⾊数据，提示错误并返回
                printError("系统还没有任何⻆⾊信息，请先创建⻆⾊信息。");
                return;
            }
            // 通过⽤户输⼊获取选中的⻆⾊
            RoleVo role = MainView.RoleView.getCacheById();
            if (role != null) {
                roleId = role.id;
            }
        } while (roleId == 0); // 确保⽤户必须选择有效的⻆⾊ ID
        // 创建⽤户数据传输对象（DTO）
        UserDto dto = new UserDto(username, name, mobile, email, deptId,
                roleId);
        // 调⽤服务层创建⽤户
        Result result = UserService.create(dto);
        // 根据结果判断是否成功创建⽤户
        if (!result.success) {
            printError(result.message); // 输出错误信息
            return;
        }
        // 创建成功，显示成功信息
        System.out.println(result.message);
        // 刷新⽤户列表
        list();
    }

    public static void update() {
        // 获取⽤户信息，如果返回为 null，则退出更新操作
        UserVo user = getCacheById();
        if (user == null) {
            return;
        }
        // 提示⽤户输⼊新的⽤户名，如果⽤户没有输⼊则保持原值
        System.out.print("请输⼊⽤户名，直接按回⻋表示不修改：");
        String username = MainView.input.nextLine();
        username = "".equals(username) ? user.username : username; // 如果为空则使⽤原值
        // 提示⽤户输⼊新的姓名，如果⽤户没有输⼊则保持原值
        System.out.print("请输⼊姓名，直接按回⻋表示不修改：");
        String name = MainView.input.nextLine();
        name = "".equals(name) ? user.name : name; // 如果为空则使⽤原值
        // 提示⽤户输⼊新的⼿机号，如果⽤户没有输⼊则保持原值
        System.out.print("请输⼊⼿机号，直接按回⻋表示不修改：");
        String mobile = MainView.input.nextLine();
        mobile = "".equals(mobile) ? user.mobile : mobile; // 如果为空则使⽤原值
        // 提示⽤户输⼊新的邮箱地址，如果⽤户没有输⼊则保持原值
        System.out.print("请输⼊邮箱，直接按回⻋表示不修改：");
        String email = MainView.input.nextLine();
        email = "".equals(email) ? user.email : email; // 如果为空则使⽤原值
        // 提示⽤户选择部⻔，直到选择有效的部⻔
        int deptId = 0;
        do {
            DeptView.list(); // 列出所有部⻔
            DeptVo dept = DeptView.getCacheById(); // 获取部⻔ ID
            if (dept != null) {
                deptId = dept.id;
            }
        } while (deptId == 0); // 如果选择⽆效则重新选择
        // 提示⽤户选择⻆⾊，直到选择有效的⻆⾊
        int roleId = 0;
        do {
            RoleView.list(); // 列出所有⻆⾊
            RoleVo role = RoleView.getCacheById(); // 获取⻆⾊ ID
            if (role != null) {
                roleId = role.id;
            }
        } while (roleId == 0); // 如果选择⽆效则重新选择
        // 创建新的 UserDto 对象，包含⽤户输⼊的更新数据
        UserDto dto = new UserDto(username, name, mobile, email, deptId,
                roleId);
        // 调⽤服务层更新⽤户数据
        Result result = UserService.update(dto, user.id);
        // 如果更新失败，输出失败信息并返回
        if (!result.success) {
            printError(result.message);
            return;
        }
        // 如果更新成功，输出成功信息并列出更新后的⽤户信息
        System.out.println(result.message);
        list(); // 列出所有⽤户
    }

    public static void toggle() {
        // 通过⽤户输⼊的 ID 获取缓存中的⽤户对象
        UserVo user = getCacheById();
        if (user == null) {
            return; // 若⽤户不存在，则直接返回
        }
        // 根据当前状态提示⽤户进⾏确认
        if (user.enabled) {
            System.out.print("输⼊'Y'确认禁⽤，输⼊其它取消禁⽤：");
        } else {
            System.out.print("输⼊'Y'确认启⽤，输⼊其它取消启⽤：");
        }
        // 获取⽤户的确认输⼊
        String confirm = MainView.input.nextLine();
        // 若⽤户未输⼊ 'Y'，则取消操作
        if (!"Y".equalsIgnoreCase(confirm)) {
            System.out.println("您已取消修改状态操作");
            return;
        }
        // 调⽤ UserService 切换⽤户状态
        Result result = UserService.toggle(user.id);
        // 若切换失败，则显示错误信息
        if (!result.success) {
            printError(result.message);
            return;
        }
        // 显示操作成功信息
        System.out.println(result.message);
        // 重新加载并显示⽤户列表
        list();
    }

    public static UserVo getCacheById() {
        // 提示⽤户输⼊ ID，要求输⼊⼤于 0 的整数
        System.out.print("请输⼊ ID，ID 必须是⼤于 0 的整数：");
        // 验证⽤户输⼊的 ID 是否为整数
        if (!MainView.input.hasNextInt()) {
            // 清除⽆效输⼊
            MainView.input.nextLine();
            printError("ID 必须为整数，请输⼊整数值");
            return null;
        }
        // 获取⽤户输⼊的 ID
        int id = MainView.input.nextInt();
        // 清除输⼊缓存中的换⾏符
        MainView.input.nextLine();
        // 验证 ID 是否⼤于 0
        if (id < 1) {
            printError("ID 必须⼤于 0，请重新输⼊");
            return null;
        }
        // 如果缓存为空，则从服务层查询所有⽤户信息并缓存
        if (cache == null) {
            // 调⽤服务层获取⽤户列表
            Result result = UserService.list();
            // 将查询到的⽤户数据缓存
            cache = (UserVo[]) result.data;
        }
        // 在缓存中查找指定 ID 的⽤户
        UserVo user = null;
        for (UserVo item : cache) {
            if (item.id == id) {
                // 找到对应 ID 的⽤户，输出⽤户信息
                System.out.println("该 ID 对应的数据是：");
                System.out.printf("id:%d，⽤户名：%s，姓名：%s，⼿机号：%s，邮箱： %s，部⻔名称：%s，⻆⾊名称：%s，状态 \n",
                item.id, item.username, item.name, item.mobile,
                        item.email, item.deptName, item.roleName,
                        item.enabled ? "启⽤" : "禁⽤");
                user = item;
                break;
            }
        }
        // 如果未找到⽤户，则提示⽤户
        if (user == null) {
            printError("当前没有该 ID 对应的数据");
            return null;
        }
        // 返回找到的⽤户信息
        return user;
    }

}